/*
给定一个二进制数组 nums , 找到含有相同数量的 0 和 1 的最长连续子数组，并返回该子数组的长度。

示例 1:

输入: nums = [0,1]
输出: 2
说明: [0, 1] 是具有相同数量0和1的最长连续子数组。
示例 2:

输入: nums = [0,1,0]
输出: 2
说明: [0, 1] (或 [1, 0]) 是具有相同数量0和1的最长连续子数组。 

提示：

1 <= nums.length <= 10^5
nums[i] 不是 0 就是 1

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/contiguous-array
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
*/

#include "../stdc++.h"

/* 前缀和 + 哈希表
把 0 当 -1，求出最长的连续子数组，和为0
*/
class Solution {
public:
    int findMaxLength(vector<int>& nums) {
        int res{0};
        unordered_map<int, int> hashMap{};
        int count{0};
        hashMap[count] = -1;
        int n = nums.size();
        for (int i{0}; i < n; ++i) {
            int num = nums[i];
            if (num == 1) {
                ++count;
            } else {
                --count;
            }
            if (hashMap.count(count) > 0) { // 遇到重复的前缀和，说明前一个下标到当前下标之间的子数组和为0，满足要求
                int preIndex = hashMap[count];
                res = max(res, i - preIndex);
            } else {
                hashMap[count] = i;
            }
        }
        return res;
    }
};
